#include<stdio.h>
int main()
{
    int ra, rb, ca, cb;
    int a[100][100] = {0};
    int b[100][100] = {0};
    int ret[100][100] = {0};
    scanf("%d %d", &ra, &ca);
    getchar();
    int i = 0;
    int j = 0;
    for (i = 0; i < ra; i++)//接收的行数
    {
        for (j = 0; j < ca; j++)//列数
        {
            scanf("%d",&a[i][j]);
            getchar();
        }
    }
    scanf("%d %d", &rb, &cb);
    getchar();
    for (i = 0; i < rb; i++)
    {
        for (j = 0; j < cb; j++)
        {
            scanf("%d",&b[i][j]);
            getchar();
        }
    }
    if (ca != rb)
    {
        printf("Error: %d != %d", ca, rb);
    }
    else
    {
        //存放计算结果到ret
        for (i = 0; i < ra; i++)//存放到第i行
        {
            for (j = 0; j < cb; j++)//存放到第j列
            {
                int n = 0;
                for (n = 0; n < ca; n++)//一次结果需要计算的数量为ca或rb
                {
                    ret[i][j] += (a[i][n] * b[n][j]);
                    //（一次循环中）a的行数不变，n变即为从左到右拿去第i行上的数字
                    //b列数不变，n变即为从上到下拿取第j列的数字
                }
            }
        }
        printf("%d %d\n", ra, cb);//打印结果矩阵的行列数
        for (i = 0; i < ra; i++)
        {
            int flag = 0;
            for (j = 0; j < cb; j++)
            {
                if(flag==1)
                {
                    printf(" ");
                }
                printf("%d", ret[i][j]);
                flag = 1;
            }
            printf("\n");
        }
    }
    return 0;
}